home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacOS 8 Resources / Developer Tools / Mac OS 8 Interfaces & Libraries / Interfaces / CIncludes / AdminMessagePort.h < prev    next >
C/C++ Source or Header  |  1996-05-01  |  4KB  |  149 lines

  1. /*
  2.      File:        AdminMessagePort.h
  3.  
  4.      Contains:    xxx put contents here xxx
  5.  
  6.      Version:    Technology:    xxx put the technology version here xxx
  7.                  Release:    Universal Interfaces 3.0d3 on Copland DR1
  8.  
  9.      Copyright:    © 1984-1996 by Apple Computer, Inc.  All rights reserved.
  10.  
  11.      Bugs?:        If you find a problem with this file, send the file and version
  12.                  information (from above) and the problem description to:
  13.  
  14.                      Internet:    apple.bugs@applelink.apple.com
  15.                      AppleLink:    APPLE.BUGS
  16.  
  17. */
  18. #ifndef __ADMINMESSAGEPORT__
  19. #define __ADMINMESSAGEPORT__
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24.  
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  28.  
  29. #if PRAGMA_IMPORT_SUPPORTED
  30. #pragma import on
  31. #endif
  32.  
  33. #if PRAGMA_ALIGN_SUPPORTED
  34. #pragma options align=mac68k
  35. #endif
  36.  
  37. #if FOR_SYSTEM8_PREEMPTIVE
  38. /*
  39. //------------------------------------------------------------------------------------
  40.  
  41.     The I/O system reserves one bit of the Kernel message system's type mask to use
  42.     for administration messages. Different services within the I/O system use this
  43.     single message type. The routine and constants described in this file are used
  44.     by clients of these administration services to distinguish between the different
  45.     types.
  46.     
  47.     It is intended that clients of I/O administration services use a single Kernel 
  48.     message port (PortID) for all messages: administration and data. Clients can
  49.     create multiple message objects (ObjectID) for the same port and pass a different
  50.     object to each administration service and use another for data handling.
  51.     
  52.     The client should use separate tasks to receive administration messages and data
  53.     messages. Use the message type parameter of ReceiveMessage as a bit-mask to specify
  54.     the type of message to receive in each task. The code below shows an example of an
  55.     administration task.
  56.     
  57.     AdministrationTask()
  58.     {
  59.         MessageControlBlock    mcb;
  60.         union {
  61.             DevNMessage        devn;
  62.             PMMessage        pm;
  63.             Arbitration        arb;
  64.         } adminBuffer;
  65.         UInt32                messageType;
  66.  
  67.         while (true) 
  68.         {
  69.             ReceiveMessageSync(adminPort, kAMPMessageTypeMask, &mcb, &adminBuffer, ...)
  70.             AMPGetMessageType(mcb->messageContents, &messageType);
  71.             
  72.             switch (messageType)
  73.             {
  74.                 case kAMPDeviceNotificationMsg:
  75.                     {
  76.                         DevNMessage* devn = mcb.messageContents;
  77.                         switch (devn->subMessageType)
  78.                         {
  79.                             ...
  80.                         }
  81.                     }
  82.                     break;
  83.                 case kAMPPowerManagementMsg:
  84.                     {
  85.                         PMMessage* pm = mcb.messageContents;
  86.                         switch (pm->type)
  87.                         {
  88.                             ...
  89.                         }
  90.                     }
  91.                     break;
  92.                 case kAMPArbitrationServiceMsg:
  93.                     {
  94.                         Arbitration* arb = mcb.messageContents;
  95.                         switch (arb->type)
  96.                         {
  97.                             ...
  98.                         }
  99.                     }
  100.                     break;
  101.                 default:
  102.                     break;
  103.             }
  104.         }
  105.     }
  106.  
  107. //------------------------------------------------------------------------------------
  108. */
  109. /*    Constants for use in ReceiveMessage.*/
  110.  
  111. enum {
  112.     kAMPMessageTypeMask            = 0x08000000,                    /* highest bit not reserved by the kernel*/
  113.     kNonKernelNonAMPMessageTypes = 0x07FFFFFF
  114. };
  115.  
  116. /*    Constants returned by AMPGetMessageType*/
  117.  
  118. enum {
  119.     kAMPDeviceNotificationMsg    = 1,
  120.     kAMPPowerManagementMsg        = 2,
  121.     kAMPArbitrationServiceMsg    = 3
  122. };
  123.  
  124. /*
  125.     AMPGetMessageType:
  126.  
  127.     Given an I/O administration message this routine determines the type of 
  128.     message. If the type cannot be deteremined zero is returned and debugging 
  129.     builds throw an assertion.
  130. */
  131. extern void AMPGetMessageType(void *messageContents, UInt32 *messageType);
  132.  
  133. #endif
  134.  
  135. #if PRAGMA_ALIGN_SUPPORTED
  136. #pragma options align=reset
  137. #endif
  138.  
  139. #if PRAGMA_IMPORT_SUPPORTED
  140. #pragma import off
  141. #endif
  142.  
  143. #ifdef __cplusplus
  144. }
  145. #endif
  146.  
  147. #endif /* __ADMINMESSAGEPORT__ */
  148.  
  149.